package leetcode.top100;

/**
 * 给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点 (i, ai) 。
 * <p>
 * 在坐标内画 n 条垂直线，垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。
 * <p>
 * 找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
 * <p>
 * 说明：你不能倾斜容器，且 n 的值至少为 2。
 * <p>
 * <p>
 * 输入：[1,8,6,2,5,4,8,3,7]
 * 输出：49
 * 类似问题见
 * 见{@link Code11_GetMaxWater_装水最多的容器}
 * 见{@link Code42_MaxWater_接雨水}
 * 见{@link Code84_MaxRectangleArea1}
 * @date 2020/3/23 23:15
 */
public class Code11_GetMaxWater_装水最多的容器 {
    //方式1：两次遍历。略。
    //方式2：基于贪心。
    public static int maxArea(int[] height) {
        if(height == null || height.length <= 1) return 0;
        int l = 0;
        int r = height.length - 1;
        int water = Math.min(height[l],height[r])*(r-l);
        int max = water;
        while (l < r){
            //贪心。谁小调动谁。 找到下一个比当前位置大的，才有可能让结果更大。
            if(height[l] < height[r]){
                int temp = height[l];
                while (l < r && temp >= height[l]) {
                    l++;
                }
            }else {
                int temp = height[r];
                while (l < r && temp >= height[r]) {
                    r--;
                }
            }
            //计算结果
            water = Math.min(height[l],height[r])*(r-l);
            max = Math.max(max,water);
        }
        return max;
    }

    public static void main(String[] args) {
        int[]arr = {1,8,6,2,5,4,8,3,7};
        System.out.println(maxArea(arr));
    }
}
